home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / pyxmpp / roster.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  9KB  |  316 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __revision__ = '$Id: roster.py 647 2006-08-26 18:27:39Z jajcus $'
  5. __docformat__ = 'restructuredtext en'
  6. import libxml2
  7. from pyxmpp.xmlextra import common_doc, get_node_ns_uri
  8. from pyxmpp.iq import Iq
  9. from pyxmpp.jid import JID
  10. from pyxmpp.utils import to_utf8, from_utf8
  11. from pyxmpp.objects import StanzaPayloadObject
  12. ROSTER_NS = 'jabber:iq:roster'
  13.  
  14. class RosterItem(StanzaPayloadObject):
  15.     xml_element_name = 'item'
  16.     xml_element_namespace = ROSTER_NS
  17.     
  18.     def __init__(self, node_or_jid, subscription = 'none', name = None, groups = (), ask = None):
  19.         if isinstance(node_or_jid, libxml2.xmlNode):
  20.             self.from_xml(node_or_jid)
  21.         else:
  22.             node_or_jid = JID(node_or_jid)
  23.             if subscription not in ('none', 'from', 'to', 'both', 'remove'):
  24.                 raise ValueError, 'Bad subscription type: %r' % (subscription,)
  25.             
  26.             if ask not in ('subscribe', None):
  27.                 raise ValueError, 'Bad ask type: %r' % (ask,)
  28.             
  29.             self.jid = node_or_jid
  30.             self.ask = ask
  31.             self.subscription = subscription
  32.             self.name = name
  33.             self.groups = list(groups)
  34.  
  35.     
  36.     def from_xml(self, node):
  37.         if node.type != 'element':
  38.             raise ValueError, 'XML node is not a roster item (not en element)'
  39.         
  40.         ns = get_node_ns_uri(node)
  41.         if ns or ns != ROSTER_NS or node.name != 'item':
  42.             raise ValueError, 'XML node is not a roster item'
  43.         
  44.         jid = JID(node.prop('jid').decode('utf-8'))
  45.         subscription = node.prop('subscription')
  46.         if subscription not in ('none', 'from', 'to', 'both', 'remove'):
  47.             subscription = 'none'
  48.         
  49.         ask = node.prop('ask')
  50.         if ask not in ('subscribe', None):
  51.             ask = None
  52.         
  53.         name = from_utf8(node.prop('name'))
  54.         groups = []
  55.         n = node.children
  56.         while n:
  57.             if n.type != 'element':
  58.                 n = n.next
  59.                 continue
  60.             
  61.             ns = get_node_ns_uri(n)
  62.             if ns or ns != ROSTER_NS or n.name != 'group':
  63.                 n = n.next
  64.                 continue
  65.             
  66.             group = n.getContent()
  67.             if group:
  68.                 groups.append(from_utf8(group))
  69.             
  70.             n = n.next
  71.         self.jid = jid
  72.         self.name = name
  73.         self.groups = groups
  74.         self.subscription = subscription
  75.         self.ask = ask
  76.  
  77.     
  78.     def complete_xml_element(self, xmlnode, _unused):
  79.         xmlnode.setProp('jid', self.jid.as_utf8())
  80.         if self.name:
  81.             xmlnode.setProp('name', to_utf8(self.name))
  82.         
  83.         xmlnode.setProp('subscription', self.subscription)
  84.         if self.ask:
  85.             xmlnode.setProp('ask', to_utf8(self.ask))
  86.         
  87.         for g in self.groups:
  88.             xmlnode.newTextChild(None, 'group', to_utf8(g))
  89.         
  90.  
  91.     
  92.     def __str__(self):
  93.         n = self.as_xml(doc = common_doc)
  94.         r = n.serialize()
  95.         n.unlinkNode()
  96.         n.freeNode()
  97.         return r
  98.  
  99.     
  100.     def make_roster_push(self):
  101.         iq = Iq(stanza_type = 'set')
  102.         q = iq.new_query(ROSTER_NS)
  103.         self.as_xml(parent = q, doc = common_doc)
  104.         return iq
  105.  
  106.  
  107.  
  108. class Roster(StanzaPayloadObject):
  109.     xml_element_name = 'query'
  110.     xml_element_namespace = ROSTER_NS
  111.     
  112.     def __init__(self, node = None, server = False, strict = True):
  113.         self.items_dict = { }
  114.         self.server = server
  115.         self.node = None
  116.         if node:
  117.             self.from_xml(node, strict)
  118.         
  119.  
  120.     
  121.     def from_xml(self, node, strict = True):
  122.         self.items_dict = { }
  123.         if node.type != 'element':
  124.             raise ValueError, 'XML node is not a roster (not en element)'
  125.         
  126.         ns = get_node_ns_uri(node)
  127.         if ns or ns != ROSTER_NS or node.name != 'query':
  128.             raise ValueError, 'XML node is not a roster'
  129.         
  130.         n = node.children
  131.         while n:
  132.             if n.type != 'element':
  133.                 n = n.next
  134.                 continue
  135.             
  136.             ns = get_node_ns_uri(n)
  137.             if ns or ns != ROSTER_NS or n.name != 'item':
  138.                 n = n.next
  139.                 continue
  140.             
  141.             
  142.             try:
  143.                 item = RosterItem(n)
  144.                 self.items_dict[item.jid] = item
  145.             except ValueError:
  146.                 if strict:
  147.                     raise 
  148.                 
  149.             except:
  150.                 strict
  151.  
  152.             n = n.next
  153.  
  154.     
  155.     def complete_xml_element(self, xmlnode, doc):
  156.         for it in self.items_dict.values():
  157.             it.as_xml(parent = xmlnode, doc = doc)
  158.         
  159.  
  160.     
  161.     def __str__(self):
  162.         n = self.as_xml(doc = common_doc)
  163.         r = n.serialize()
  164.         n.unlinkNode()
  165.         n.freeNode()
  166.         return r
  167.  
  168.     
  169.     def __iter__(self):
  170.         return self.items_dict.itervalues()
  171.  
  172.     
  173.     def __contains__(self, jid):
  174.         return jid in self.items_dict
  175.  
  176.     
  177.     def __getitem__(self, jid):
  178.         return self.items_dict[jid]
  179.  
  180.     
  181.     def get_items(self):
  182.         return self.items_dict.values()
  183.  
  184.     items = property(get_items)
  185.     
  186.     def get_groups(self):
  187.         r = { }
  188.         for it in self.items_dict.values():
  189.             it.groups = _[1]
  190.             if it.groups:
  191.                 for g in it.groups:
  192.                     r[g] = True
  193.                 
  194.             []
  195.             r[None] = True
  196.         
  197.         return r.keys()
  198.  
  199.     
  200.     def get_items_by_name(self, name, case_sensitive = True):
  201.         if not case_sensitive and name:
  202.             name = name.lower()
  203.         
  204.         r = []
  205.         for it in self.items_dict.values():
  206.             if it.name == name:
  207.                 r.append(it)
  208.                 continue
  209.             if it.name is None:
  210.                 continue
  211.                 continue
  212.             if not case_sensitive and it.name.lower() == name:
  213.                 r.append(it)
  214.                 continue
  215.         
  216.         return r
  217.  
  218.     
  219.     def get_items_by_group(self, group, case_sensitive = True):
  220.         r = []
  221.         if not group:
  222.             for it in self.items_dict.values():
  223.                 it.groups = _[1]
  224.                 if not it.groups:
  225.                     r.append(it)
  226.                     continue
  227.                 []
  228.             
  229.             return r
  230.         
  231.         if not case_sensitive:
  232.             group = group.lower()
  233.         
  234.         for it in self.items_dict.values():
  235.             group if group in it.groups else []
  236.         
  237.         return r
  238.  
  239.     
  240.     def get_item_by_jid(self, jid):
  241.         if not jid:
  242.             raise ValueError, 'jid is None'
  243.         
  244.         return self.items_dict[jid]
  245.  
  246.     
  247.     def add_item(self, item_or_jid, subscription = 'none', name = None, groups = (), ask = None):
  248.         if isinstance(item_or_jid, RosterItem):
  249.             item = item_or_jid
  250.             if self.items_dict.has_key(item.jid):
  251.                 raise ValueError, 'Item already exists'
  252.             
  253.         elif self.items_dict.has_key(item_or_jid):
  254.             raise ValueError, 'Item already exists'
  255.         
  256.         if not (self.server) or subscription not in ('none', 'from', 'to', 'both'):
  257.             subscription = 'none'
  258.         
  259.         if not self.server:
  260.             ask = None
  261.         
  262.         item = RosterItem(item_or_jid, subscription, name, groups, ask)
  263.         self.items_dict[item.jid] = item
  264.         return item
  265.  
  266.     
  267.     def remove_item(self, jid):
  268.         del self.items_dict[jid]
  269.         return RosterItem(jid, 'remove')
  270.  
  271.     
  272.     def update(self, query):
  273.         ctxt = common_doc.xpathNewContext()
  274.         ctxt.setContextNode(query)
  275.         ctxt.xpathRegisterNs('r', ROSTER_NS)
  276.         items = ctxt.xpathEval('r:item')
  277.         ctxt.xpathFreeContext()
  278.         if not items:
  279.             raise ValueError, 'No item to update'
  280.         
  281.         local_items = []
  282.         for item in items:
  283.             item = RosterItem(item)
  284.             jid = item.jid
  285.             subscription = item.subscription
  286.             
  287.             try:
  288.                 local_item = self.get_item_by_jid(jid)
  289.                 local_item.subscription = subscription
  290.             except KeyError:
  291.                 if subscription == 'remove':
  292.                     return [
  293.                         RosterItem(jid, 'remove')]
  294.                 
  295.                 if self.server or subscription not in ('none', 'from', 'to', 'both'):
  296.                     subscription = 'none'
  297.                 
  298.                 local_item = RosterItem(jid, subscription)
  299.  
  300.             if subscription == 'remove':
  301.                 del self.items_dict[local_item.jid]
  302.                 return [
  303.                     RosterItem(jid, 'remove')]
  304.             
  305.             local_item.name = item.name
  306.             local_item.groups = list(item.groups)
  307.             if not self.server:
  308.                 local_item.ask = item.ask
  309.             
  310.             self.items_dict[local_item.jid] = local_item
  311.             local_items.append(local_item)
  312.         
  313.         return local_items
  314.  
  315.  
  316.